package com.wk.paradise.redis.config.redisConfig;

import org.apache.commons.lang3.math.NumberUtils;
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
import org.springframework.boot.CommandLineRunner;
import org.springframework.context.annotation.Configuration;

/**
 * @Classname RedisPoolConfig
 * @Description redis配置
 * @Date 2019/12/16 10:52
 * @Author by weikai
 */
@Configuration
public class RedisPoolConfig extends GenericObjectPoolConfig implements CommandLineRunner {

  private static final int DEF_TIME_BETWEEN_EVICTION_RUNS_MILLIS = 30000;

  private static final int DEF_MIN_EVICTABLE_IDLE_TIMEMILLIS = 60000;

  private String maxIdleStr;

  private String maxTotalStr;

  private String maxWaitMillisStr;

  public RedisPoolConfig() {

    /*
    如果为true，表示有一个idle object evitor线程对idle object进行扫描，
    如果validate失败，此object会被从pool中drop掉；
    这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义；
     */
    setTestWhileIdle(true);

    /*
    minEvictableIdleTimeMillis：表示一个对象至少停留在idle状态的最短时间，
    然后才能被idle object evitor扫描并驱逐；
    这一项只有在timeBetweenEvictionRunsMillis大于0时才有意义；
     */
    setMinEvictableIdleTimeMillis(DEF_MIN_EVICTABLE_IDLE_TIMEMILLIS);

    /*
    表示idle object evitor两次扫描之间要sleep的毫秒数；
     */
    setTimeBetweenEvictionRunsMillis(DEF_TIME_BETWEEN_EVICTION_RUNS_MILLIS);

    /*
    表示idle object evitor每次扫描的最多的对象数；
     */
    setNumTestsPerEvictionRun(-1);
  }

  public String getMaxIdleStr() {
    return maxIdleStr;
  }

  public void setMaxIdleStr(String maxIdleStr) {
    this.maxIdleStr = maxIdleStr;
  }

  public String getMaxTotalStr() {
    return maxTotalStr;
  }

  public void setMaxTotalStr(String maxTotalStr) {
    this.maxTotalStr = maxTotalStr;
  }

  public String getMaxWaitMillisStr() {
    return maxWaitMillisStr;
  }

  public void setMaxWaitMillisStr(String maxWaitMillisStr) {
    this.maxWaitMillisStr = maxWaitMillisStr;
  }

  @Override
  public void run(String... strings) throws Exception {
    /*
    设置最大闲置数
     */
    this.setMaxIdle(NumberUtils.toInt(maxIdleStr, DEFAULT_MAX_IDLE));

    /*
    设置最大连接数
     */
    this.setMaxTotal(NumberUtils.toInt(maxTotalStr, DEFAULT_MAX_TOTAL));

    /*
    最大等待时间
     */
    this.setMaxWaitMillis(NumberUtils.toLong(maxWaitMillisStr, DEFAULT_MAX_WAIT_MILLIS));

    /*
    如果为true，则得到的jedis实例均是可用的；
     */
    this.setTestOnBorrow(true);

    /*
    在return给pool时，是否提前进行validate操作；
     */
    this.setTestOnReturn(true);
  }
}
